#ifndef GY_PROPERTYINFO_H
#define GY_PROPERTYINFO_H

#include <QObject>
#include "GY_Variant.h"
/**
 * @brief The PropertyType enum
 * 属性类型枚举
 */
enum PropertyType
{
    //!float
    FloatPropertyType,
    //!int
    IntPropertyType,
    //!double
    DoublePropertyType,
    //!qreal
    QrealPropertyType,
    //!bool
    BoolPropertyType,
    //!ushort
    UshortPropertyType,
    //!点
    PointPropertyType,
    //!颜色
    ColorPropertyType,
    //!线条样式
    LineStylePropertyType,
    //!填充样式
    FillStylePropertyType,
    //!填充图案
    PatternPropertyType,
    //!字符串
    QStringPropertyType,
    //!fill渐变
    FillGradientPropertyType,
    //!字体对齐方式
    TextAlignmentPropertyType,
    //!字体样式
    FontIdPropertyType,
    //!null
    NullPropertyType,
};
Q_DECLARE_METATYPE(PropertyType);

/**
 * @brief The PropertyType enum
 * 更新类型枚举
 */
enum PropertyUpdateType
{
    //!普通属性
    OrdinaryAttributes=0x01,
    //!相对点
    PointOfRelative=0x02,
    //!绝对点
    AbsolutePoint=0x04,
    //!不更新
    NotUpdate=0x08,
    //!赋值更新
    Update=0x10,
    //!移动更新
    MoveUpdate=0x20
};

template<class T,class F>
T super_cast(F fFun) {
    union {
      T u_tFun;
      F u_fFun;
    } fun;
    fun.u_fFun = fFun;
    return fun.u_tFun;
}
class GY_PropertyInfo : public QObject
{
    Q_OBJECT
public:
    explicit GY_PropertyInfo(QObject *parent = nullptr);
    GY_PropertyInfo(const GY_PropertyInfo &other);
    ~GY_PropertyInfo();
    GY_PropertyInfo &operator=(const GY_PropertyInfo& value);
    typedef bool (GY_PropertyInfo::*UpdatePropertyFun)(const QString & , const QVariant &);
    void setConnect();
public:
    //!属性名称
    QString propertyName;
    //!属性更新函数
    UpdatePropertyFun updatePropertyFun;
    //!属性值
    GY_Variant propertyValue;
    //!属性类型
    PropertyType propertyType;
    //!更新类型
    int updateType;

};

#endif // GY_PROPERTYINFO_H
